package com.atguigu.exam.controller;

import com.atguigu.exam.common.Result;
import com.atguigu.exam.entity.Notice;
import com.atguigu.exam.service.NoticeService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 公告控制器 - 处理系统公告管理相关的HTTP请求
 * 包括公告的增删改查、状态管理、前台展示等功能
 */
@RestController
@Tag(name = "公告管理")
@RequestMapping("/api/notices")
@CrossOrigin
public class NoticeController {
    
    /**
     * 注入公告业务服务
     */
    @Autowired
    private NoticeService noticeService;

    /**
     * 获取启用的公告（前台首页使用）
     * @return 公告列表
     */
    @Operation(summary = "获取启用公告")
    @GetMapping("/active")
    public Result<List<Notice>> getActiveNotices(){
        List<Notice> list = noticeService.list(new LambdaQueryWrapper<Notice>().eq(Notice::getIsActive, 1));
        return Result.success(list);
    }

    
    /**
     * 获取最新的几条公告（前台首页使用）

     * @return 公告列表
     */
@Operation(summary = "获取最新的公告")
    @GetMapping("/latest")
    public Result<List<Notice>> getLatestNotices(){
        //创建LambdaQueryWrapper对象
        LambdaQueryWrapper<Notice> noticeLambdaQueryWrapper = new LambdaQueryWrapper<>();
        //查询启用的公告
        noticeLambdaQueryWrapper.eq(Notice::getIsActive,1);
        //按照最近更新时间排序
        noticeLambdaQueryWrapper.orderByDesc(Notice::getUpdateTime);
        //使用last方法添加limit5
        noticeLambdaQueryWrapper.last("LIMIT 5");
        //调用noticeService中list方法
        List<Notice> list = noticeService.list(noticeLambdaQueryWrapper);
        return Result.success(list);
    }
    
    /**
     * 获取所有公告（管理后台使用）
     * @return 公告列表
     */
    @Operation(summary = "获取所有公告")
    @GetMapping("/list")
    public Result<List<Notice>> list(){
        List<Notice> list = noticeService.list(new LambdaQueryWrapper<Notice>());
        return Result.success(list);
    }

    
    /**
     * 根据ID获取公告
     * @param id 公告ID
     * @return 公告详情
     */
    @Operation(summary = "根据ID获取公告")
    @GetMapping("/{id}")
    public Result<Notice> getNoticeById(@PathVariable Long id){
        Notice notice = noticeService.getById(id);
        return Result.success(notice);
    }

    
    /**
     * 添加公告
     * @param notice 公告对象
     * @return 操作结果
     */
    @Operation(summary = "添加公告")
    @PostMapping("/add")
    public Result add(@RequestBody Notice notice){
        boolean save = noticeService.save(notice);
        if (save) {
            return Result.success("添加成功");
        }else {
            return Result.error("添加失败");
        }
    }

    
    /**
     * 更新公告
     * @param notice 公告对象
     * @return 操作结果
     */
    @Operation(summary = "更新公告")
    @PutMapping("/update")
    public Result update(@RequestBody Notice notice){
        boolean update = noticeService.updateById(notice);
        if(update){
            return Result.success("更新成功");
        }else{
            return Result.error("更新失败");
        }
    }
    
    /**
     * 删除公告
     * @param id 公告ID
     * @return 操作结果
     */
    @Operation(summary = "根据id删除轮播图信息")
    @DeleteMapping("/delete/{id}")
    public Result delete(@PathVariable Long id){
        boolean b = noticeService.removeById(id);
        if (b)  {
            return Result.success("删除成功");
        }else {
            return Result.error("删除失败");
        }
    }
    
    /**
     * 启用/禁用公告
     * @param id 公告ID
     * @param isActive 是否启用
     * @return 操作结果
     */
    @Operation(summary = "切换公告状态")
    @PutMapping("/toggle/{id}")
    public Result toggle(@PathVariable Long id,@RequestParam Boolean isActive){
        LambdaUpdateWrapper<Notice> noticeLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        //设置更新条件:公告id等于传入id
        noticeLambdaUpdateWrapper.eq(Notice::getId,id);
        //设置要更新的字段:isActive(是否启用)
        noticeLambdaUpdateWrapper.set(Notice::getIsActive,isActive);
        //调用noticeService中update方法
        boolean update = noticeService.update(noticeLambdaUpdateWrapper);
        if (update) {
            return Result.success("公告状态切换成功");
        } else {
            return Result.error("公告状态切换失败");
        }
    }

} 